package msgcomm;

import java.util.Map;

import msgcomm.messages.Message;


public interface Hooks {

	/**
	 * Risponde ad una richiesta bloccante. non viene mai richiamato in modo 
	 * concorrente: viene sempre gestita una richiesta alla volta.
	 * @param msg il messaggio di richiesta
	 * @return il messaggio di risposta
	 */
	public Message respondToRequest(Message msg);
	
	/**
	 * Aggancio che viene richiamato quando un transceiver si sta unendo ad un 
	 * gruppo. Il metodo viene richiamato dal transceiver che ha fatto la richiesta
	 * di unione, dopo che la mappa locale del gruppo
	 * viene aggiornato all'interno del transceiver, ma prima che vengano
	 * notificati tutti gli altri transceiver dell'avvenuta unione (notifica NotifyChangeGroup)
	 * @param group tutti i membri del gruppo, compreso il richiedente
	 */
	public void hookJoinGroup(Map<String, Receiver> group);
	
	/**
	 * Aggancio richiamato quando un transceiver si sta unendo ad un gruppo.
	 * Il metodo viene richiemato dal transceiver a cui e' stata inviata la richiesta.
	 * Restituisce true se l'unione puo' avvenire, false altrimenti
	 * @param name nome del tranceiver che si vuole unire
	 * @return vedi descrizione
	 */
	public boolean hookCanItJoin(String name);
}
